Bevezets a Visual Basic-be (VB 3.0-ra alapozva)
================================================
Hetedik rsz


Nem esett sz mg nhny igencsak hasznos, a VB-be beptett fggvnyrl, eljrsrl. Ezt a hinyt ptolom most. Lesz sz mg a nyomtatsrl s a rajzolsrl is.

String-eket kezel fggvnyek
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

A legegyszerbb string-es tri: Left, Right, Mid. Mit is csinlnak ezek? Az adott karakterlncot "megcsonktjk", egy bizonyos szably szerint. A Left pldul azt csinlja, hogy a paramterben megadott string szintn paramterknt megadott valamely betjtl kezdve elhagyja az utna kvetkez rszt. Egy kicsit rhetbben: ha mondjuk az a string-nk, hogy "Bevezetes a VB rejtelmeibe", s a harmadik karaktert adjuk meg paramteknt, akkor a vgeredmny "Bev" lesz.

Eredeti$ = "Bevezetes a VB rejtelmeibe"
Uj$ = Left(Eredeti$, 3)          ' Uj$ ekkor "Bev"

(Persze a fenti kt sort le lehet rvidteni, pl.: Uj$ = Left("Bevezetes a VB rejtelmeibe",3), de most vgig gy fogom rni, hogy tiszta legyen a kp.)

A Left prja a Right. Ez ugyanazt csinlja, mint a Left, csak nem balrl, hanem jobbrl kezdi el nzni a karaktereket.

Eredeti$ = "Bevezetes a VB rejtelmeibe"
Uj$ = Right(Eredeti$, 3)          ' Uj$ ekkor "ibe"

A Mid-nek mr eggyel tbb paramtere van. Itt mr te adhatod meg azt, hogy hnyadik karaktertl kezdjen el szmolni. Pldul ha a msodik karaktertl akarsz 5 bjtot (karaktert) levgni, akkor a vgeredmny "eveze", ha a nyolcadiktl kettt, akkor "es", s gy tovbb.

Eredeti$ = "Bevezetes a VB rejtelmeibe"
Uj1$ = Mid(Eredeti$,3,3)           ' Uj1$ ekkor "vez"
Uj2$ = Mid(Eredeti$,5,7)           ' Uj2$ ekkor "zetes a"


Ehhez a rszhez tartozik mg a Len funkci is, de errl mr volt sz korbban is: ez visszaadja a karakterlnc hosszsgt:

Karlanc$ = "1234567890"
Hossz = Len(Karlanc$)              ' Hossz ekkor 10


A Trim fggvny(ek)re fleg akkor van szksg, ha fel kell dolgozni a felhasznl ltal megadott adatokat. Ez a fggvny levgja a string elejn s vgn tallhat (felesleges) szkzket. Hasznlata igen egyszer:

Eredeti$ = "                       Tizenketto          "
Uj$ = Trim(Eredeti$)				' Uj$ ekkor "Tizenketto"

Van kt "testvre", az LTrim, ami csak a string elejn lv szkzket, s az RTrim, ami csak a string vgn lv szkzket vgja le.


Fjlrendszert kezel eljrsok, fggvnyek
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Kezdjk a knyvtrakkal. Knyvtrakat ugye lehet ltrehozni, trlni (VB-ben alapban csak akkor, ha res), s knyvtrat vltani. Erre a hrom utasts:

ChDir ("ebbe")     ' Knyvtr vlts
MkDir ("ezt")      ' Knyvtr ltrehozsa
RmDir ("azt")      ' Knyvtr trlse

Lehetsg van meghajt-vltsra is. Ezt a ChDrive eljrssal tudjuk megtenni:

ChDrive ("A:")

Ha azt akarjuk megnzni, hogy most melyik knyvtrban is vagyunk, arra a CurDir fggvnyt kell hasznlni:

Most$ = CurDir$

Ha ms meghajtt akarjuk megtudni, akkor a formtum a kvetkez:

Most$ = CurDir("A:")

Felhvom a figyelmet arra, hogy ha valami hiba lp fel, akkor jnnek a run-time error-ok. Ezeknek kezelsre nzd meg vagy az a fjlkezelsrl szl (tdik) rszt, vagy a Boco ltal rtakat.

Trjnk t a fjlokra. A fjlmsols utastsa a FileCopy. Paramtereknt rtelemszeren a forrs- s utna a clfjlt kell megadni. Sajnos nem lehet jokerkaraktereket megadni (teht "*.txt", vagy ilyesmi).

FileCopy "c:\command.com","c:\command.co_"

Az tnevezs parancsa a Name. Paramterei: rgi nv, j nv. A Name-mel nem csak fjlokat lehet tnevezni, hanem knyvtrakat is, akr akkor is, ha a knyvtr nem res. A paramterket As szcskval kell elvlasztani. Lehet hasznlni fjl thelyezsre is:

Name "c:\command.co_" As "c:\proba\command.co_"

Knyvtrokat thelyezni azonban a Name nem tud.

Fjlok trlst a Kill paranccsal rhetjk el. Ez megsznteti a fjl bejegyzst a FAT tbln, nem pedig thelyezi a Lomtrba!!! gyhogy legyl vatos, az gy trlt fjlokon mr csak esetleg az undelete nev programocska segt, ha hagyja mkdni a Windowsod. A paramtereknl lehet hasznlni jokerkaraktereket.

Kill "c:\proba\command.co_"

Esetenknt szksg lehet arra, hogy megllaptsd a fjl mrett. Erre a LOF (Length of File) fggvny alkalmas, eltte azonban meg kell nyitni a fjlt, s paramterknt a fjlcsatornt kell megadni.

Open "c:\proba\command.co_" for Input as #1
Meret = LOF(1)
Close #1

A fenti megolds akkor praktikus, ha a fjlt mr amgyis megnyitottuk. Ha nincs megnyitva, akkor hasznlhatjuk a FileLen-t is:

Meret = FileLen("c:\proba\command.co_")

A fjlok tulajdonsgait is meg tudjuk vltoztatni, (a DOS-os ATTRIB parancsnak megfelelen) a SetAttr utastssal. Formtuma:

SetAttr Fajl,Tulajdonsagok

A Tulajdonsagok lehetnek:

1: csak olvashat
2: rejtett
4: rendszerfjl
32: archivland

Ha azt akarod, hogy egy fjl rejtett legyen s rendszerfjl, akkor 2+4, teht 6-ot adsz meg paramternek.

Ha nem lltani, hanem lekrdezni szeretnd a fjlok tulajdonsgait, akkor a GetAttr parancsot kell hasznlni. Formtuma:

Tulajdonsag = GetAttr("c:\proba\command.co_")

A Tulajdonsag vltoz a fenti tblzat szerint pl fel, azonban mg kiegszl a kvetkezkkel is:

8: volume label, meg tudja valaki mondani nekem, hogy ez micsoda??? Azt tudom, hogy ktetcimke, de hogy jn ide???
16: knyvtr

A tulajdonsgok megllaptsnak legegyszerbb mdja, ha egy logikai S mvelet elvgzsvel vgigmsz az sszes tulajdonsgon. 

Tulajdonsagok = GetAttr("c:\windows")

If Tulajdonsagok And 1 Then MsgBox "Csak olvashat."
If Tulajdonsagok And 2 Then MsgBox "Rejtett."
If Tulajdonsagok And 4 Then MsgBox "Ez egy renderszfjl."
If Tulajdonsagok And 16 Then MsgBox "Ez egy knyvtr."
If Tulajdonsagok And 32 Then MsgBox "Archivland."


Dtumot kezel eljrsok, fggvnyek
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Sok dtumot kezel fggvnynek alapja a Now fggvny, ez visszaadja a mostani dtumot s idt, string formtumban:

Print Now

Ha ezt fel akarjuk dolgozni, de ebbl csak egy adat szksges neknk, akkor hasznlhatnnk vagy a  string-et kezel fggvnyeket, de sokkal egyszerbb, ha a kln erre kszlt fggvnyeket hasznljuk. Mindegyiknek paramterknt az egsz dtumot (teht a Now-t) clszer megadni:

Print Year(Now)                 ' v
Print Month(Now)		' Hnap
Print Day(Now)			' Nap
Print Hour(Now)			' ra
Print Minute(Now)		' Perc
Print Second(Now)		' Msodperc

Lekrdezhetjk a mostani nap nevt is:

Print Weekday(Now)

Arra szmtottunk, hogy kirja pl. "Htf", de csak egy szmot kaptunk! Ha htf van, akkor kettt. s ez mg nem is logikus (legalbbis neknk, magyarok szmra), mert az els napnak egyesnek kne lennie. Csak hogy a VB angol nyelvterleten szletett, ahol a vasrnap szmt a ht els napjnak, ezrt az egyes a vasrnapot jelli, a kettes a htft, a hrmas a keddet, stb. Itt egy j kis rutin, amivel meg lehet kapni a napok magyar nevt:

Select Case Weekday(Now)
  Case 1: Nap$ = "Vasrnap"
  Case 2: Nap$ = "Htf"
  Case 3: Nap$ = "Kedd"
  Case 4: Nap$ = "Szerda"
  Case 5: Nap$ = "Cstrtk"
  Case 6: Nap$ = "Pntek"
  Case 7: Nap$ = "Szombat"
End Select

Print Nap$

Van egy kln Date$ s Time$ is, amiben csak a dtum/id szerepel:

Print Date$
Print Time$

De mi van, ha nem tetszik neknk a formtuma? Erre talltk ki a Format nev fggvnyt, ami egy kicsit kipofozza neknk a dtumot, vagy ppen az idt. Kicsit visszatrnk teht a Now fggvnyhez:

Print Format$(Now,"yy-mm-dd")

Ha ppen 2001. janur elseje van (amikor is rom ezt), akkor ez bizony csak gy fogja visszaadni a dtumot: "01-01-01"

Mi azonban szeretnnk egy kicsit mskpp, mondjuk azt, hogy rja ki az egsz vszmot, s ne ktjel, hanem kettspont vlassza el egymstl a dtum klnbz elemeit!

Print Format$(Now,"yyyy:mm:dd")

Ez gy mr sokkal szebb...

Ha az "mm" helyett "mmmm"-et runk, akkor ki fogja rni a hnapot (sajnos angolul), ha pedig "dddd"-t, akkor pedig angolul a nap nevt.

Egy kicsit rendszerezetebben:

Karlanc$ = Format$(Now,Formatum)

ahol Formatum hatrozza meg a kirs formtumt :-)

"d": kirja, hogy a hnap hnyadik napja van. (pl. "5")
"dd": kirja, hogy a hnap hnyadik napja van, de ha tznl kisebb akkor egy nullt is rak el (pl. "05")
"ddd": kirja a nap nevt rviden (pl. "Mon")
"dddd": kirja a nap nevt teljesen (pl. "Monday")
"ddddd": kirja az egsz dtumot, rvid formtumban (pl. "2001.01.01.")
"dddddd": kirja az egsz dtumot, teljesen (pl. "2001. January 1.")
"w": szmmal meghatrozza, hogy a ht melyik napja van (itt is els a vasrnap")
"ww": az v hnyadik hete van most
"m": az v hnyadik hnapja van (pl. "1")
"mm": az v hnyadik hnapja van, de ha tznl kisebb akkor egy nullt is rak el (pl. "01")
"mmm": az v hnyadik hnapja van, rviden (pl. "Jan")
"mmmm": az v hnyadik hnapja van, teljesen (pl. "January")
"q": hnyadik negyedv van
"y": az v hnyadik napja van (1 s 366 kz esik)
"yy": melyik v van, kt szmjeggyel (pl. "01")
"yyyy": melyik v van, ngy szmjeggyel (pl. "2001")
"h": hny ra van (pl. "9")
"hh": hny ra van, de ha tznl kisebb akkor egy nullt is rak el (pl. "09")
"n": perc kirsa (pl. "6")
"nn": perc kirsa, de ha tznl kisebb akkor egy nullt is rak el (pl. "06")
"s": msodperc kirsa (pl. "8")
"ss": msodperc kirsa, de ha tznl kisebb akkor egy nullt is rak el (pl. "08")
"AM/PM": dleltt vagy dlutn van-e, ennek az utolsnak elg sok varicija van.

Akkor dihjban ennyit errl :-)


Vglap kezelse
-=-=-=-=-=-=-=-=

A vglapot (vagy clipboard-ot) mindenki ismeri, de csak kevesebben tudjk, hogy ez a neve. Ide kerlnek ugyanis a Msols/Kivgs menpontokkal kimsolt/kivgott szvegrszletek, vagy esetleg kprszletek. Ha ezt ismered, akkor mr tnyleg hatkony Windows-os progikat tudsz majd kszteni.

s egyltaln nem nehz a hasznlata, a Clipboard objektumot kell hasznlni. A Clear metdus trli a vglapon jelenlv adatokat. A GetText a vglapon elhelyezett szveget hozza le, a GetData a vglapon elhelyezett kpet. A SetText-tel tudsz szveget, a SetData-val pedig egyb adatot (azaz kpet :-) ) elhelyezni a vglapon.

Teht ha kvncsi vagy, hogy pp milyen szveg van a vglapon, akkor

Print Clipboard.GetText()

Ha nincs semmi, akkor termszetesen nem fog kirni semmit.

Ha szveget akarsz elhelyezni, akkor:

Clipboard.SetText("Ezt mr n rtam ide!")

Tegyl le egy picturebox-ot, s adj meg neki valami alaprtelmezett kpet. A Picture1_Click-hez rd be, hogy 

ClipBoard.SetData Picture1.Picture

Indtsd el a programot, kattints r a kpre, lpj ki, majd tltsd be a kedvenc kpszerkeszt programodat. Vagy akr a Paint-et, ha nincs ms. A kpet be tudod illeszteni.

Tegyl le mg egy picturebox-ot, s annak a Click metdushoz rd be, hogy

Picture2.Picture = Clipboard.GetData

(A vglap kezelse nem ennyiben merl ki, egyes fggvnyeknek vannak paramterei, de az alapvet hasznlathoz ez is bven elg)


Szveg nyomtatsa
-=-=-=-=-=-=-=-=-

Nagyon sokan krdeztk mr tlem a nyomtats alapjait. A nyomtatt legegyszerbben a Printer objektumon keresztl rhetjk el. Ezen keresztl kldhetnk neki parancsokat.

Printer.Print "Hah!"

Ha a fenti sort egy command button-hoz rsz be, a programot elindtod, s megnyomod a gombot, akkor azt vrnd, hogy kinyomtassa a "Hah!" stringet. Ez valban gy is lesz, de csak miutn lelltod a programot. Mindig meg kell ugyanis adni, hogy mikor van vge a nyomtatra kldtt adatoknak. Ezt a 

Printer.Enddoc

sor beiktatsval rheted el. Lehetsg van arra is, hogy a nyomtat mr a kvetkez oldalra nyomtasson. A

Printer.NewPage

sor utn a nyomtatnak megadott adatok mr egy j oldalra fognak tcsszni.

Mi a helyzet akkor, ha egy nagyobb mennyisg szveget akarunk kinyomtatni? Ez sajnos nem mehet gy, hogy egyszeren mindent belerakok egy vltozba, aztn Printer.Print Mindent$, mert a nyomtat egy rzkeny llek, s nem br tl hossz (mondjuk 200-250 karakternl hosszabb) szvegeket egyszerre befogadni. Ilyenkor a megolds sajnos csak a szveg feldarabolsa lehet. Majd a doksi vgn mutatok egy darabol mdszert.

Rajzols
-=-=-=-=

Ezt egyszer mr valakinek elkldtem e-mailben, s mgegyszer nem rom meg... gyhogy valakinek ismers lesz a kvetkez pr sor :-)

Kezdjk a legegyszerbbel. A PSet parancs pontok rajzolsra j. Els paramternek az X, msodiknak az Y pozcit adod meg, harmadiknak esetleg azt, hogy milyen sznt akarsz hasznlni.

PSet (1000, 1000), &HFF0F00

Alapesetben a koordintk "mrtkegysge" nem pixel, hanem "twip". Tizent twip egyenl egy pixellel. Termszetesen meg lehet adni pixelben is a koordintkat, ekkor azonban a Form Scalemode tulajdonsgt t kell lltani. Ahogy ltom, van tbb mrtkegysg is, a "Centimeter", "Inch" s ilyesmik gondolom egyrtelmek, a tbbirl ("User", "Point") fogalmam sincs.

A Line parancs tbbmindenre is j. Lehet vele simn vonalakat rajzolni, ekkor a 

Line (KezdoX,KezdoY)-(VegX,VegY),Szin 

formtumban kell hasznlni (a szn itt se ktelez, ekkor a VB az ablak ForeColor tulajdonsgban belltott sznvel fog dolgozni).

A Line-nal lehet tglalapokat is rajzolni. Ekkor utols paramterknt egy B bett kell rni, s a sznt ktelez feltntetni - csak hogy logikus legyen :-)

Line (KezdoX,KezdoY)-(VegX,VegY),Szin,B

Ha azt akarod, hogy a tglalapod ki is legyen tltve, akkor ne B-t, hanem BF-t rj.

A krrel mr sokmindent lehet kezdeni. Egy szp, szablyos krt gy kapsz:

Circle (KozeppontX,KozeppontY),Sugar

Ezt lehet bonyoltani. A kvetkez paramter a szn lehet, utna pedig az kvetkezik, hogy hny foknl kezddjn, s hny foknl rjen vget a "kr". 
Mg egy paramter lehet, ez azt adja meg, hogy mennyire deformldjon el a szablyos kr. Alaprtke egy. Plda egy szp krre:

Circle (3000, 3000), 2000, 0, 1, .5, 4

A parancsok hasznlatrl rok mg egy pr sort: ha nem adsz semmit, akkor magra a formra fogja rajzolni a dolgokat. Ha egy objektumot megadsz eltte, akkor pedig a megfelel objektumra fog firklni. Ilyen lehet pldul picturebox.

Fontos, hogy az elemen (amire rajzolni akarsz) az AutoRedraw tulajdonsg True legyen, klnben gondok tmadhatnak! Pldul az, hogy nem rajzolja ki az brt. Ezt ki tudod prblni akkor, ha a Form_Load()-nl rsz be mondjuk egy Circle-t, s az AutoRedraw-t False-ra lltod. Nem fog semmi trtnni.
Feleslegesen azonban ne hasznld az elbbi tulajdonsgot, mert ha mr mondjuk 15 elem AutoRedraw-ja True, akkor a program rezheten lelassul.


Nyomtats II.
-=-=-=-=-=-=-

Nem csak form s picturebox objektumokra tudsz rajzolni, hanem a nyomtatra is. Itt is ugyangy llthatod a Scalemode tulajdonsgot (Printer.Scalemode = 4).

Szvegeket is szebben tudsz nyomtatni, ha hasznlod a Printer tulajdonsgait. Ezek magukrt beszlnek: Font, FontSize, FontBold, FontItalic, stb...

A nyomtats lezrsaknt itt ll egy rutin, ami feldarabolva kldi a nyomtatra a szvegeket. Nem tkletes, de kezdetnek nem rossz:

Sub SzovegNyomtat (Mit As String)
  SorTores = 80

  Iteraciok = (Len(Mit) / SorTores)

  Mostnyomtat = Left(Mit, SorTores - 1)
  Printer.Print Mostnyomtat
  
  For X = 1 To Iteraciok
    Mostnyomtat = Mid(Mit, X * SorTores, SorTores)
    Printer.Print Mostnyomtat
  Next X
End Sub

Felhvom a figyelmed arra, hogy ez csak bizonyos fontbelltsoknl mkdik. Ezek: Courier New karakterkszlet, 11,28-as mret. Ha ms belltsokat hasznlsz, babrlnod kell a SorTores vltozval - vagy kszthetsz ennl jobb rutinokat is, ami minden esetben mkdik. Addig is rd be ezzel :-) Lehet hogy az egsz fenti megolds elvileg hibs, de nem tudtam jobbat...

(A SorTores = 80 rtkben nem vagyok biztos, de nem akartam hszmilli paprt elpocskolni a prblkozssal, lehet hogy 79, vagy 78...)




Ezt azt iromnyt Kvi Blint ksztette. Fellem azt csinlsz vele, amit akarsz, trhatod, de azrt emlts meg engem is, j? Frisstseket, folytatsokat mindig tallhatsz a Visual Basic znban: http://w3.swi.hu/vbzona/